package com.mlh.string;

/**
 * @author 缪林辉
 * @date 2024/2/29 10:48
 * @DESCRIPTION
 * 给你一个字符串 s ，请你反转字符串中 单词 的顺序。
 * 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
 * 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
 * 注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。
 * 输入：s = "  hello world  "  (输入含有前导空格和尾随空格)
 * 输出："world hello"
 * 解释：反转后的字符串中不能存在前导空格和尾随空格。
 *
 * 输入：s = "a good   example"
 * 输出："example good a"
 * 解释：如果两个单词间有多余的空格，反转后的字符串需要将单词间的空格减少到仅有一个。
 */
public class ReverseWords {

    public static void main(String[] args) {
        String s ="a good   example";
        ReverseWords reverseWords = new ReverseWords();
        String res = reverseWords.method1(s);
        System.out.println(res);
    }

    //思路：从尾扫描 遇到第一个非空格字符记录该位置，然后继续扫描直到扫描到空格字符，记录其前一个位置
    //这样就记录下一个完整单词的位置，然后写入到新的数组
    //这里主要要处理 扫描到最后一个单词的情况
    //第一种情况：有前导空格
    //第二种情况：没有前导空格
    //处理好这两种情况，这道题就解决了
    public String method1(String s) {
        char[] sc = s.toCharArray();
        char[]nc=new char[sc.length];
        boolean flag=false;
        int f1=0,b1=0,f2=0;
        for(int i=sc.length-1;i>=0;i--){
            //空格的ascii值是32直接利用这个来判断空格
            if(sc[i]==32&&flag==false){//这里实际上可以删除的，但是为了后面方便看懂就不删除了

            }else if(sc[i]==32&&flag==true){
                //记录完整单词的起始位置
                f1=i+1;
                f2=method1Aux(f1,b1,f2,sc,nc);
                flag=false;
            }else{
                //空格后第一个字符 记录位置为b1
                if(!flag){
                    b1=i;
                }
                flag=true;
            }
        }
        //判断有没有前导空格
        if(sc[0]!=32){
            f2=method1Aux(0,b1,f2,sc,nc);
        }
        return String.valueOf(nc, 0, f2-1);
    }

    //函数功能：将sc的f1到b1位置的字符复制到nc的f2位置上去
    public int method1Aux(int f1,int b1,int f2,char[]sc,char[]nc){
        for(int i=f1;i<=b1;i++){
            nc[f2++]=sc[i];
        }
        nc[f2]=32;
        return f2+1;//这里+1过后 f2的位置就可以直接写入下一个新单词
    }
}
